package com.fengyunhe.manager.service;

import com.fengyunhe.common.bean.PageList;
import com.fengyunhe.manager.CurrentUser;
import com.fengyunhe.common.bean.Page;
import com.fengyunhe.common.bean.Page.Offset;
import com.fengyunhe.common.bean.TreeNode;
import com.fengyunhe.common.bean.UserSimpleVo;
import com.fengyunhe.manager.vo.AdminUserVo;
import org.apache.shiro.subject.Subject;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface AdminUserService {

    /**
     * 分页查询用户
     *
     * @param page
     * @param likeRealName
     * @return
     */
    public PageList<AdminUserVo> findByPage(Offset page, String likeRealName, String usertype);

//    /**
//     * 通过用户ID得到
//     *
//     * @param userId 用户ID
//     * @return
//     */
//    public AdminUserEntity getAdminUserById(Integer userId);

    /**
     * 通过用户登录名得到用户信息
     *
     * @param loginName 用户登录名
     * @return 用户的详细信息
     */
    public AdminUserVo getAdminUserByLoginName(String loginName);

    /**
     * 创建一个用户
     *
     * @param user
     * @return 主键
     * @throws Exception
     */
    public Integer addAdminUser(AdminUserVo user) throws Exception;

    /**
     * 更新用户信息
     *
     * @param user
     * @return （true:更新成功，false:更新失败）
     * @throws Exception
     */
    public boolean updateAdminUser(AdminUserVo user) throws Exception;


    /**
     * 通过用户ID删除一个用户
     *
     * @param userId 用户ID
     * @return （true:删除成功，false:删除失败）
     * @throws Exception
     */
    public boolean deleteAdminUser(Integer userId) throws Exception;


    /**
     * 密码验证
     *
     * @param email
     * @param password
     * @return
     */
    public Integer checkUserPassword(String email, String password);

    /**
     * 修改密码
     *
     * @param userId
     * @param oldPassword
     * @param newPassword
     * @return
     */
    public boolean updateUserPassword(Integer userId, String oldPassword,
                                      String newPassword);

    /**
     * 通过角色得到用户
     *
     * @param roleId 角色
     * @param page   分页
     * @return
     * @throws Exception
     */
    public PageList<AdminUserVo> getUserPageListByRoleId(Integer roleId,
                                                         Page page) throws Exception;

    /**
     * 通过角色查询用户
     * @param roleId
     * @param usertype
     * @param keywords
     * @param page
     * @return
     * @throws Exception
     */
    public PageList<AdminUserVo> getUserPageListByRoleId(Integer roleId, String usertype,String keywords,
                                                         Page page) throws Exception;

    /**
     * 查询用户的所有权限
     *
     * @param userId
     * @return
     */
    public Set<String> getUserPerms(int userId);


    /**
     * 查询用户的角色
     *
     * @param userId
     * @return
     */
    List<Integer> getRoleIdListByAdminUserId(Integer userId);

    /**
     * 返回管理员菜单树节点
     *
     * @param subject
     * @return
     */
    List<TreeNode> getAdminTreeNodes(Subject subject);

    /**
     * 密码加密
     *
     * @param email         邮箱
     * @param plainPassword 未加密的密码
     * @return 返回加密后的密码
     */
    public String encryptPassword(String email, String plainPassword);


    /**
     * 检查密码是否正确
     *
     * @param userId        用户id
     * @param inputPassword 输入的密码
     * @return 正确返回true，不正确返回false
     */
    public boolean checkPassword(Integer userId, String inputPassword);

    /**
     * 更新用户角色
     *
     * @param userId 用户id
     * @param roleId 角色id数组
     * @return
     */
    boolean updateAdminUserRoles(Integer userId, Integer[] roleId);

    /**
     * 更新最后一次登录的时间
     *
     * @param currentUser 当前用户登录
     */
    void updateLastLoginInfo(CurrentUser currentUser);


    /**
     * 根据用户的ID批量查询昵称
     *
     * @param userId
     * @return
     */
    public Map<Integer, String> getNicknameMap(Integer... userId);

    /**
     * 根据用户的ID批量查询真实姓名
     *
     * @param userId 用户ID
     * @return
     */
    public Map<Integer, String> getRealNameMap(Integer... userId);


    /**
     * 检查用户是否存在并且是指定类型的用户
     *
     * @param userId   用户ID
     * @param userType 用户的类型
     * @return
     */
    public boolean checkUserExistAndType(Integer userId, Integer userType);

    /**
     * 根据openId获取到userId
     *
     * @param openId
     * @return
     */
    Integer getUserIdByOpenId(String openId);

    /**
     * 根据ID查询用户
     *
     * @param id
     * @return
     */
    AdminUserVo getAdminUserById(Integer id);

    /**
     * 根据主键查询用户的真实姓名
     *
     * @param userId
     * @return
     */
    public String getRealNameByUserId(Integer userId);

    /**
     * 通过userId查询Nickname
     *
     * @param userId
     * @return
     */
    public String getNickNameByUserId(Integer userId);

    /**
     * 返回某个用户的简要信息
     *
     * @param userId
     * @return
     */
    public UserSimpleVo getUserSimpleVo(Integer userId);

    /**
     * 查询用户简要信息列表
     *
     * @param userType 用户类型限制，如果不指定则不限制用户类型
     * @param name     模糊匹配用户昵称或姓名
     * @return
     */
    List<UserSimpleVo> findUserSimpleVoByUserType(Integer userType, String name);

    /**
     * 根据用户id查询openId
     *
     * @param userId
     * @return
     */
    String getOpenIdById(Integer userId);


    /**
     * 根据用户id查询email
     *
     * @param advertiserId
     * @return
     */
    String getEmailById(Integer advertiserId);

    /**
     * 检测用户是否是超级用户
     *
     * @param userId
     * @return
     */
    boolean checkUserIsSuperMan(Integer userId);


    /**
     * 启用用户
     *
     * @param userId
     */
    void updateUserToEnabled(Integer userId);

    /**
     * 停用用户
     *
     * @param userId
     */
    void updateUserToDisabled(Integer userId);

    void testTrasaction();
}
